<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script>
    //第一遍:
    //async 函数返回promise实例,状态默认pending,当async函数全部执行完返回成功的promise实例
    //      值为async函数的返回值
    //      当async函数内部有报错,后面的代码就不会执行,返回失败的promise实例返回值为报错信息
     async function getDate(){

        console.log('请开始表演');
        // await 后面不是promise实例 就不会等await后面的异步
        // await 必须等promise实例状态改变才会执行下面的代码.
        // 如果promise实例状态一致是pending就会一直等promise实例
        
        await new Promise((resolve,reject)=>{
            setTimeout(()=>{
            console.log('抽烟喝酒');
            resolve();
            //await里面代码有报错后面的代码就不会执行
            //await返回值就是等待的promise实例成功状态的值
            // 当await等待的promise实例为失败状态,则async函数返回值和这个失败的promise保持一致,停止后面的代码运行
            // reject()
        },2000)
        });
        //当async内部return是promise实例的时候,async返回值跟promise实例保持一致
        // return 1
        return Promise.resolve(1)
        console.log('表演结束');
    };

    const result = getDate();
    console.log('result',result);

    console.log('继续表演');


    //第二遍:
    // async function getDate1(){
    //     console.log('开始喝酒');
    //     await new Promise((resolve,reject)=>{
    //     // await 后面不是promise实例 就不会等await后面的异步
    //     // await 必须等promise实例状态改变才会执行下面的代码.
    //     // 如果promise实例状态一致是pending就会一直等promise实例
    //         try{
    //             // throw new Error('装逼失败')
    //             setTimeout(()=>{
    //                 console.log('开始喝第一瓶,跟白开水一样');
    //                 resolve('感觉非常好')
    //                 //await里面代码有报错后面的代码就不会执行
    //                 //await返回值就是等待的promise实例成功状态的值
    //                 // 当await等待的promise实例为失败状态,则async函数返回值和这个失败的promise保持一致,停止后面的代码运行
    //             },2000)
    //         }catch(e){
    //             reject(e.message)
    //         }
    //     });
    //      //当async内部return是promise实例的时候,async返回值跟promise实例保持一致
    //     return Promise.resolve(1)
    //     console.log('第二瓶不在话下');

    // }
    // const result1 = getDate1();
    // console.log('result1',result1);

    
    //第三遍
    async function getDate2(){
        console.log('开始请求数据');
        await new Promise((resolve,reject)=>{
        // await 后面不是promise实例 就不会等await后面的异步
        // await 必须等promise实例状态改变才会执行下面的代码.
        // 如果promise实例状态一致是pending就会一直等promise实例
            try{
                // throw new Error('请求数据超时')
                setTimeout(()=>{
                    console.log('请求数据成功');
                    resolve('感觉非常好')
                    //await里面代码有报错后面的代码就不会执行
                    //await返回值就是等待的promise实例成功状态的值
                    // 当await等待的promise实例为失败状态,则async函数返回值和这个失败的promise保持一致,停止后面的代码运行
                },2000)
            }catch(e){
                reject(e.message)
            }
        });
         //当async内部return是promise实例的时候,async返回值跟promise实例保持一致
        return Promise.resolve(1)
        console.log('请求数据结束');

    }
    const result2 = getDate2();
    console.log('result2',result2);



</script>
</body>
</html>